home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 2003 August / MW 8 2003 CD1.iso / Inside Macworld / Product News / gimp-1.2.4.sit / gimp-1.2.4 / plug-ins / perl / embed / perlmod.c < prev   
Encoding:
C/C++ Source or Header  |  2000-06-06  |  2.2 KB  |  118 lines

  1. #include <EXTERN.h>
  2. #include <perl.h> 
  3.  
  4. #include <stdio.h>
  5.  
  6. #include <libgimp/gimpmodule.h>
  7.  
  8. #include "../gppport.h"
  9.  
  10. static GimpModuleInfo info = {
  11.     NULL,
  12.     "Generic Embedded Perl Interpreter",
  13.     "Marc Lehmann <pcg@goof.com>",
  14.     "v0.00",
  15.     "(c) 1999, released under the GPL",
  16.     "1999-04-14"
  17. };
  18.  
  19. void ERR(char *msg)
  20. {
  21.   STRLEN dc;
  22.   dTHR;
  23.  
  24.   fprintf (stderr, "(Perl module error, please report!) %s: %s\n", msg, SvPV(ERRSV,dc));
  25. }
  26.  
  27. static PerlInterpreter *interp;
  28.  
  29. static int perl_init(void)
  30. {
  31.   if (!interp)
  32.     {
  33.       extern void xs_init();
  34.       char *embedding[] = { "", "-e", "0" };
  35.       SV *res;
  36.  
  37.       interp = perl_alloc();
  38.       if (interp)
  39.         {
  40.       perl_construct(interp);
  41.           {
  42.             dTHR; /* NOT earlier! */
  43.  
  44.             perl_parse(interp, xs_init, 3, embedding, NULL);
  45.             perl_eval_pv ("require Gimp::Module", FALSE);
  46.  
  47.             if (SvTRUE (ERRSV))
  48.               {
  49.                 ERR ("error during require Gimp::Module, perl NOT initialized!");
  50.                 return GIMP_MODULE_UNLOAD;
  51.               }
  52.  
  53.             res = perl_eval_pv ("Gimp::Module::_init()", FALSE);
  54.             if (SvTRUE (ERRSV))
  55.               {
  56.                 ERR ("error during require Gimp::Module::_init(), perl NOT initialized!");
  57.                 return GIMP_MODULE_UNLOAD;
  58.               }
  59.  
  60.             if (res && SvIOK (res))
  61.               return SvIV (res);
  62.           }
  63.         }
  64.  
  65.       return GIMP_MODULE_UNLOAD;
  66.     }
  67.  
  68.   return GIMP_MODULE_OK;
  69. }
  70.  
  71. static void perl_deinit(void)
  72. {
  73.   dTHR;
  74.  
  75.   if (interp)
  76.     {
  77.       perl_run(interp);
  78.       perl_eval_pv ("Gimp::Module::_deinit()", FALSE);
  79.  
  80.       if (SvTRUE (ERRSV))
  81.         ERR ("error during require Gimp::Module::_init()");
  82.  
  83.       PL_perl_destruct_level = 0;
  84.       perl_destruct(interp);
  85.       perl_free(interp);
  86.  
  87.       interp = 0;
  88.     }
  89. }
  90.  
  91. G_MODULE_EXPORT GimpModuleStatus
  92. module_init (GimpModuleInfo **inforet)
  93. {
  94.   GimpModuleStatus s;
  95.  
  96.   *inforet = &info;
  97.   
  98.   s = perl_init ();
  99.  
  100.   if (s != GIMP_MODULE_OK)
  101.     perl_deinit ();
  102.  
  103.   return s;
  104. }
  105.  
  106. G_MODULE_EXPORT void
  107. module_unload (void *shutdown_data,
  108.                void (*completed_cb)(void *),
  109.                void *completed_data)
  110. {
  111.   perl_deinit ();
  112.   /* perl is unloadable (atexit & friends), *sigh* */
  113.   /* completed_cb (completed_data); */
  114. }
  115.  
  116.  
  117.  
  118.